A storage medium may comprise storage locations that are reinitialized each time new data is written thereto. As used herein, reinitializing a storage location refers to transitioning the storage location from an unwritable state to a writable state. In some embodiments, the writable state of a storage location comprises an erased state, and the unwritable state of the storage location comprises a non-erased state. Accordingly, reinitializing a storage location may comprise erasing the storage location. Erase operations may require more time to complete than other storage operations (e.g., 10 to 100 times longer than write and/or read operations). Accordingly, a storage controller may maintain a pool of erased storage locations so that storage requests do not stall while the storage locations needed to service the requests are erased.
Storage locations may have a limited useful life, which may be quantified in terms of the number of program and/or erase operations the storage locations can endure before failure. The useful life of a storage location may be further reduced by write amplification. Write amplification result from inefficient garbage collection operations, which may require rewriting data to the storage medium. Purely greedy garbage collection, however, may result in poor wear leveling performance. What is needed are systems and methods for selecting storage resources for recovery that minimize write amplification, maximize freed storage space, and maintain wear leveling across the storage medium.